#include <bits/stdc++.h>

#ifndef DEBUG
#define NDEBUG
#endif

#define MS 101

using namespace std;
using ll = long long;

inline bool canReach(array<ll,2> &c1, array<ll, 2> &c2, ll r){
    return hypot(c1[0] - c2[0], c1[1] - c2[1]) <= r * 1.0;

}

int main(){
    int n, m, k, r;    
    cin >> n>>m>>k>>r;
    vector<array<ll, 2>> routers(n+m,{0,0});//存储路由器位置
    vector<bitset<MS>> inQueue(n+m,{0});//inQueue[i][j]表示到路由器i的路径上有j个新增路由器的路由器i是否已经访问过
    queue<array<int, 3>> q;//队列，用于BFS，0,1,2位置分别表示路由器编号，经过多少个路由器（不含起点，含终点）, 和经过多少个新增路由器
    
    vector<int> anses;

    for(int i=0;i<m+n;i++){
        cin >> routers[i][0] >> routers[i][1];
    }
    q.push({0,0,0});
    inQueue[0][0]=true;
    while(!q.empty()){
        auto front = q.front();
        q.pop();

        //将可能的答案入栈
        if(front[0] == 1)
            anses.push_back(front[1]);

        for(int i=1;i<m+n;i++){
            //宽度遍历
            int j = front[2] + i >= n?1:0;
            if(!inQueue[i][j] && j <= k && canReach(routers[front[0]], routers[i], r)){
                q.push({i,front[1] + 1, j});
                inQueue[i][j] = true;
            }
        }
    }

    cout << *min_element(anses.begin(), anses.end()) - 1 ;
    return 0;
}